# VK.com (former Vkontakte)

VK.com (former Vkontakte) auth service support.

## OAuth2

VK.com uses OAuth2 for Authentication.

- Register a new application at the VK.com API,

- fill `Application Id` and `Application Secret` values in the settings:

      SOCIAL_AUTH_VK_OAUTH2_KEY = ''
      SOCIAL_AUTH_VK_OAUTH2_SECRET = ''

- Add `'social.backends.vk.VKOAuth2'` into your `SOCIAL_AUTH_AUTHENTICATION_BACKENDS`.

- Then you can start using `/login/vk-oauth2` in your link href.

- Also it’s possible to define extra permissions with:

      SOCIAL_AUTH_VK_OAUTH2_SCOPE = [...]

  See the VK.com list of permissions.

## OAuth2 Application

To support OAuth2 authentication for VK.com applications:

- Create your IFrame application at VK.com.

- In application settings specify your IFrame URL `mysite.com/vk` (current default).

- Fill `Application ID` and `Application Secret` settings:

      SOCIAL_AUTH_VK_APP_KEY = ''
      SOCIAL_AUTH_VK_APP_SECRET = ''

- Fill `user_mode`:

      SOCIAL_AUTH_VK_APP_USER_MODE = 2

  Possible values:
    - `0`: there will be no check whether a user connected to your application or not
    - `1`: `python-social-auth` will check `is_app_user` parameter VK.com sends when user opens application page one time
    - `2`: (safest) `python-social-auth` will check status of user interactively (useful when you have interactive authentication via AJAX)

- Add a snippet similar to this into your login template:

      <script src="http://vk.com/js/api/xd_connection.js?2" type="text/javascript"></script>
      <script type="text/javascript">
          VK.init(function() {
                  VK.addCallback("onApplicationAdded", requestRights);
                  VK.addCallback("onSettingsChanged", onSettingsChanged);
              }
          );

          function startConnect() {
              VK.callMethod('showInstallBox');
          }

          function requestRights() {
              VK.callMethod('showSettingsBox', 1 + 2); // 1+2 is just an example
          }

          function onSettingsChanged(settings) {
              window.location.reload();
          }
      </script>
      <a href="#" onclick="startConnect(); return false;">Click to authenticate</a>

To test, launch the server using `sudo ./manage.py mysite.com:80` for browser to be able to load it when VK.com calls IFrame URL. Open your VK.com application page via http://vk.com/app<app_id>. Now you are able to connect to application and login automatically after connection when visiting application page.

For more details see authentication for VK.com applications

## OpenAPI

You can also use VK.com’s own OpenAPI to log in, but you need to provide HTML template with JavaScript code to authenticate, check below for an example.

- Get an OpenAPI App Id and add it to the settings:

      SOCIAL_AUTH_VK_OPENAPI_ID = ''

  This app id will be passed to the template as `VK_APP_ID`.

Snippet example:

    <script src="http://vk.com/js/api/openapi.js" type="text/javascript"></script>
    <script type="text/javascript">
        var vkAppId = {{ VK_APP_ID|default:"null" }};
        if (vkAppId) {
            VK.init({ apiId: vkAppId });
        }
        function authVK () {
            if (!vkAppId) {
                alert ("Please specify VK.com APP ID in your local settings file");
                return false;
            }
            VK.Auth.login(function(response) {
                var params = "";
                if (response.session) {
                    params = "first_name=" + encodeURI(response.session.user.first_name) + "&last_name=" + encodeURI(response.session.user.last_name);
                    params += "&nickname=" + encodeURI(response.session.user.nickname) + "&id=" + encodeURI(response.session.user.id);
                }
                window.location = "{{ VK_COMPLETE_URL }}?" + params;
            });
            return false;
        }
    </script>
    <a href="javascript:void(0);" onclick="authVK();">Click to authorize</a>